HA 集群配置

        HA 即 (high available)高可用,又被叫做双机热备,用于关键性业务。 简单理解就是,有两台机器A和B,正常是A提供服务,B待命闲置,当A宕机或服务宕掉,会切换至B机器继续提供服务。常用实现高可用的开源软件有heartbeat和keepalived,其中keepalived有负载均衡的功能。

images

        如图所示为一个 HA 结构,一个交换机下面有两台机器 web1 和 web2 ,其中 web1 为主节点,正常是它在提供服务,而 web2 备用节点是闲置的。 web1 和 web2 中间有一根心跳线,检查对方的存活状态。流动 IP ,也叫 vip 是对外提供服务的 ip ,正常情况下,是配置在 web1 上的,当 web1 宕机后, web2 会自动配置该 vip ,对外提供服务。

heartbeat 部署

        下面使用 heartbeat 来做 HA 集群,并且把 nginx 服务作为 HA 对应的服务

准备工作

        两台机器,都是 centos6.5,网卡 eth0 ip 地址为

1
2
master 192.168.0.69
slave 192.168.0.68

        eth1 ip 地址为

1
2
master 192.168.91.100
slave 192.168.91.101

1. hostname 设置好,分别为 master 和 slave

        主上设置 hostname

1
2
3
[root@HA1 ~]# hostname master
[root@HA1 ~]# bash
[root@master ~]# vim /etc/sysconfig/network

        编辑文件

1
2
NETWORKING=yes
HOSTNAME=master

        从上设置 hostname

1
2
3
[root@HA2 ~]# hostname slave
[root@HA2 ~]# bash
[root@slave ~]# vim /etc/sysconfig/network

        编辑文件

1
2
NETWORKING=yes
HOSTNAME=master

2.关闭防火墙

        主和从上都操作

1
2
iptables -F
service iptables save

        主和从都关闭 selinux

1
2
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

3.配置 hosts

        主和从都编辑

1
vim /etc/hosts

        增加内容

1
2
192.168.0.69 master
192.168.0.68 slave

4.安装 epel 扩展源

        主和从都执行

1
yum install -y epel-release

5.安装 heartbeat

        主和从都执行

1
yum install -y heartbeat* libnet nginx

6.主上(master)配置

1
2
3
[root@master ~]# cd /usr/share/doc/heartbeat-3.0.4/
[root@master heartbeat-3.0.4]# cp authkeys ha.cf haresources /etc/ha.d
[root@master heartbeat-3.0.4]# cd /etc/ha.d

        然后编辑

1
[root@master ha.d]# vim authkeys

        更改

1
2
3
4
#auth 1
#1 crc
#2 shal HI!
#3 md5 Hello!

        修改为

1
2
3
4
#auth 3
#1 crc
#2 shal HI!
3 md5 Hello!

        这是用来验证的 crc 最简单, shal 最复杂。

        然后修改权限

1
[root@master ha.d]# chmod 600 authkeys

        编辑 haresources 文件

1
2
3
[root@master ha.d]# vim haresources
#
#nodel 10.0.0.170 Filesystem::/dev/sda1::data1:;ext2

        修改为

1
2
#
master 192.168.0.70/24/eth0:0 nginx

        说明:master 为主节点 hostname ,192.168.0.70 为 vip ,/24 为24网段,eth0:0 为 vip 的设备名,nginx 为 heartbeat 监控的服务,也是两台机器对外提供的核心服务。

        然后编辑 ha.cf

        清空 ha.cf

1
2
[root@master ha.d]# >ha.cf
[root@master ha.d]# vim ha.cf

        增加内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 60
udpport 694
ucast eth1 192.168.91.101
auto_failback on
node master
node slave
ping 192.168.91.1
respawn hacluster /usr/lib64/heartbeat/ipfail

        配置说明:

  • debugfile /var/log/ha-debug:该文件保存 heartbeat 的调试信息;
  • logfile /var/log/ha-log:heartbeat 的日志文件;
  • keepalive 2:心跳的时间间隔,默认时间单位为秒;
  • deadtime 30:超出该时间间隔未收到对方节点的心跳,则认为对方已经死亡;
  • warntime 10:超出该时间间隔未收到对方节点的心跳,则发出警告并记录到日志中;
  • initdead 60:在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,该选项用于解决这种情况产生的时间间隔。取值至少为 deadtime 的两倍;
  • udpport 694:设置广播通信使用的端口, 694 为默认使用的端口;
  • ucast eth1 192.168.91.101:设置为对方机器心跳检测的网卡和 ip;
  • auto_failback on:heartbeat 的两台机器分别为主节点和从节点。主节点在正常情况下占用资源并运行所有的服务,遇到故障时把资源交给从节点并由从节点运行服务。在该选项为 on 的情况下,一旦主节点恢复运行,则自动获取资源并取代从节点,负责不取代从节点;
  • node: 指定主和从,各占一行,主在上从在下;
  • respawn hacluster /usr/lib/heartbeat/ipfail:指定与 heartbeat 一同启动和关闭的进程,该进程被自动监视,遇到故障则重新启动。最常用的进程是 ipfail ,该进程用于检测和处理网络故障,需要配合 ping 语句指定的 ping node 来检测网络连接。如果系统是64,注意该文件的路径/usr/lib64/heartbeat/ipfail

7.把主上的三个配置文件拷贝到从上

1
2
[root@master ~]# cd /etc/ha.d/
[root@master ha.d]# scp authkeys ha.cf haresources slave:/etc/ha.d/

        scp 命令安装

1
yum -y install openssh-clients

        如果提示错误,主从都安装

8.从上(slave)编辑 ha.cf

1
[root@slave ~]# vim /etc/ha.d/ha.cf

        ucast eth1 192.168.91.101 修改为 ucast eth1 192.168.91.100

9.启动 heartbeat

        先主,后从

1
# service heartbeat start

10.检查测试

        主执行

1
[root@master ~]# ifconfig

        看是否有 eth0:0

images

1
[root@master ~]# ps aux | grep nginx

        看是否有 nginx 进程

images

11.测试1

        主上故意禁 ping

1
[root@master ~]# iptables -I INPUT -p icmp -j DROP

        从上执行

1
[root@slave ~]# ifconfig

        看是否有 eth0:0

images

1
[root@slave ~]# ps aux | grep nginx

        看是否有 nginx 进程

images

        主上执行

1
[root@master ~]# iptables -D INPUT -p icmp -j DROP

        主上恢复 eth0:0 和 nginx,从上停止 eth0:0 和 nginx 服务

12.测试2

        主上停止 heartbeat 服务

1
[root@master ~]# service heartbeat stop

        从上会启动 eth0:0 和 nginx 服务

        主上开启 heartbeat 服务

1
[root@master ~]# service heartbeat start

        主上恢复 eth0:0 和 nginx 服务,从上停止 eth0:0 和 nginx 服务

13.测试脑裂

        主和从上都 down 掉 eth1 网卡

1
ifdown eth1

        主和从都会启动 eth0:0 网卡和 nginx 服务